100 numpy exercises

This is a collection of exercises that have been collected in the numpy mailing list, on stack overflow and in the numpy documentation. The goal of this collection is to offer a quick reference for both old and new users but also to provide a set of exercices for those who teach.

If you find an error or think you've a better way to solve some of them, feel free to open an issue at https://github.com/rougier/numpy-100

1. Import the numpy package under the name np (★☆☆)


In [11]:
import numpy as np

#print(np.show_config())


blas_mkl_info:
    libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread']
    library_dirs = ['/anaconda/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/anaconda/include']
blas_opt_info:
    libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread']
    library_dirs = ['/anaconda/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/anaconda/include']
openblas_lapack_info:
  NOT AVAILABLE
lapack_mkl_info:
    libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread']
    library_dirs = ['/anaconda/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/anaconda/include']
lapack_opt_info:
    libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread']
    library_dirs = ['/anaconda/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/anaconda/include']
None

2. Print the numpy version and the configuration (★☆☆)


In [12]:
print(np.show_config())


blas_mkl_info:
    libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread']
    library_dirs = ['/anaconda/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/anaconda/include']
blas_opt_info:
    libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread']
    library_dirs = ['/anaconda/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/anaconda/include']
openblas_lapack_info:
  NOT AVAILABLE
lapack_mkl_info:
    libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread']
    library_dirs = ['/anaconda/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/anaconda/include']
lapack_opt_info:
    libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread']
    library_dirs = ['/anaconda/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/anaconda/include']
None

3. Create a null vector of size 10 (★☆☆)


In [8]:
Z = np.zeros(10)
print (Z)


[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]

4. How to find the memory size of any array (★☆☆)


In [13]:
Z = np.zeros((10,10))
print("%d bytes" % (Z.size * Z.itemsize))


800 bytes

5. How to get the documentation of the numpy add function from the command line? (★☆☆)


In [14]:
python -c "import numpy;numpy.info(numpy.add)"


  File "<ipython-input-14-e16f0f33e632>", line 1
    python -c "import numpy;numpy.info(numpy.add)"
                                                 ^
SyntaxError: invalid syntax

6. Create a null vector of size 10 but the fifth value which is 1 (★☆☆)


In [15]:
Z =np.zeros((10,10))
Z[4] = 1

print(Z)


[[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.]
 [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]]

7. Create a vector with values ranging from 10 to 49 (★☆☆)


In [15]:
z = np.arange(10,49)
print(z)


[10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
 35 36 37 38 39 40 41 42 43 44 45 46 47 48]

8. Reverse a vector (first element becomes last) (★☆☆)


In [17]:
z = np.arange(50)
z[::-1]


Out[17]:
array([49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33,
       32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16,
       15, 14, 13, 12, 11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1,  0])

9. Create a 3x3 matrix with values ranging from 0 to 8 (★☆☆)


In [34]:
z = np.reshape(np.arange(9),(3,3))
print (z)


[[0 1 2]
 [3 4 5]
 [6 7 8]]

10. Find indices of non-zero elements from [1,2,0,0,4,0] (★☆☆)


In [35]:
z = np.nonzero([1,2,0,0,4,0])
print (z)


(array([0, 1, 4], dtype=int64),)

11. Create a 3x3 identity matrix (★☆☆)


In [39]:
z = np.eye(3)
print(z)


[[ 1.  0.  0.]
 [ 0.  1.  0.]
 [ 0.  0.  1.]]

12. Create a 3x3x3 array with random values (★☆☆)


In [ ]:
z = np.random.random((3,3,3))
print(z)

13. Create a 10x10 array with random values and find the minimum and maximum values (★☆☆)


In [44]:
z = np.random.random((10,10))
z_min,z_max = z.min(),z.max()
print(z_min)
print(z_max)


0.00129457043586
0.996015785979

14. Create a random vector of size 30 and find the mean value (★☆☆)


In [46]:
z = np.random.random(30)
print(z.mean())


0.508736705621

15. Create a 2d array with 1 on the border and 0 inside (★☆☆)


In [49]:
Z = np.ones((10,10))
Z[1:-1,1:-1] = 0
print(Z)


[[ 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.]
 [ 1.  0.  0.  0.  0.  0.  0.  0.  0.  1.]
 [ 1.  0.  0.  0.  0.  0.  0.  0.  0.  1.]
 [ 1.  0.  0.  0.  0.  0.  0.  0.  0.  1.]
 [ 1.  0.  0.  0.  0.  0.  0.  0.  0.  1.]
 [ 1.  0.  0.  0.  0.  0.  0.  0.  0.  1.]
 [ 1.  0.  0.  0.  0.  0.  0.  0.  0.  1.]
 [ 1.  0.  0.  0.  0.  0.  0.  0.  0.  1.]
 [ 1.  0.  0.  0.  0.  0.  0.  0.  0.  1.]
 [ 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.]]

16. How to add a border (filled with 0's) around an existing array? (★☆☆)


In [ ]:

17. What is the result of the following expression? (★☆☆)

0 * np.nan
np.nan == np.nan
np.inf > np.nan
np.nan - np.nan
0.3 == 3 * 0.1

In [55]:
print(0 * np.nan)
print(np.nan == np.nan)
print(np.nan > np.nan)
print(np.nan - np.nan)
print(0.3 == 3 * 0.1)


nan
False
False
nan
0.30000000000000004

18. Create a 5x5 matrix with values 1,2,3,4 just below the diagonal (★☆☆)


In [ ]:

19. Create a 8x8 matrix and fill it with a checkerboard pattern (★☆☆)


In [ ]:

20. Consider a (6,7,8) shape array, what is the index (x,y,z) of the 100th element?


In [ ]:

21. Create a checkerboard 8x8 matrix using the tile function (★☆☆)


In [ ]:

22. Normalize a 5x5 random matrix (★☆☆)


In [ ]:

23. Create a custom dtype that describes a color as four unsigned bytes (RGBA) (★☆☆)


In [ ]:

24. Multiply a 5x3 matrix by a 3x2 matrix (real matrix product) (★☆☆)


In [ ]:

25. Given a 1D array, negate all elements which are between 3 and 8, in place. (★☆☆)


In [ ]:

26. What is the output of the following script? (★☆☆)

# Author: Jake VanderPlas

print(sum(range(5),-1))
from numpy import *
print(sum(range(5),-1))

In [ ]:

27. Consider an integer vector Z, which of these expressions are legal? (★☆☆)

Z**Z
2 << Z >> 2
Z <- Z
1j*Z
Z/1/1
Z<Z>Z

In [ ]:

28. What are the result of the following expressions?

np.array(0) / np.array(0)
np.array(0) // np.array(0)
np.array([np.nan]).astype(int).astype(float)

In [ ]:

29. How to round away from zero a float array ? (★☆☆)


In [ ]:

30. How to find common values between two arrays? (★☆☆)


In [ ]:

31. How to ignore all numpy warnings (not recommended)? (★☆☆)


In [ ]:

32. Is the following expressions true? (★☆☆)

np.sqrt(-1) == np.emath.sqrt(-1)

In [ ]:

33. How to get the dates of yesterday, today and tomorrow? (★☆☆)


In [ ]:

34. How to get all the dates corresponding to the month of July 2016? (★★☆)


In [ ]:

35. How to compute ((A+B)*(-A/2)) in place (without copy)? (★★☆)


In [ ]:

36. Extract the integer part of a random array using 5 different methods (★★☆)


In [ ]:

37. Create a 5x5 matrix with row values ranging from 0 to 4 (★★☆)


In [ ]:

38. Consider a generator function that generates 10 integers and use it to build an array (★☆☆)


In [ ]:

39. Create a vector of size 10 with values ranging from 0 to 1, both excluded (★★☆)


In [ ]:

40. Create a random vector of size 10 and sort it (★★☆)


In [ ]:

41. How to sum a small array faster than np.sum? (★★☆)


In [ ]:

42. Consider two random array A and B, check if they are equal (★★☆)


In [ ]:

43. Make an array immutable (read-only) (★★☆)


In [ ]:

44. Consider a random 10x2 matrix representing cartesian coordinates, convert them to polar coordinates (★★☆)


In [ ]:

45. Create random vector of size 10 and replace the maximum value by 0 (★★☆)


In [ ]:

46. Create a structured array with x and y coordinates covering the [0,1]x[0,1] area (★★☆)


In [ ]:

47. Given two arrays, X and Y, construct the Cauchy matrix C (Cij =1/(xi - yj))


In [ ]:

48. Print the minimum and maximum representable value for each numpy scalar type (★★☆)


In [ ]:

49. How to print all the values of an array? (★★☆)


In [ ]:

50. How to find the closest value (to a given scalar) in an array? (★★☆)


In [ ]:

51. Create a structured array representing a position (x,y) and a color (r,g,b) (★★☆)


In [ ]:

52. Consider a random vector with shape (100,2) representing coordinates, find point by point distances (★★☆)


In [ ]:

53. How to convert a float (32 bits) array into an integer (32 bits) in place?


In [ ]:

54. How to read the following file? (★★☆)

1, 2, 3, 4, 5
6,  ,  , 7, 8
 ,  , 9,10,11

In [ ]:

55. What is the equivalent of enumerate for numpy arrays? (★★☆)


In [ ]:

56. Generate a generic 2D Gaussian-like array (★★☆)


In [ ]:

57. How to randomly place p elements in a 2D array? (★★☆)


In [ ]:

58. Subtract the mean of each row of a matrix (★★☆)


In [ ]:

59. How to sort an array by the nth column? (★★☆)


In [ ]:

60. How to tell if a given 2D array has null columns? (★★☆)


In [ ]:

61. Find the nearest value from a given value in an array (★★☆)


In [ ]:

62. Considering two arrays with shape (1,3) and (3,1), how to compute their sum using an iterator? (★★☆)


In [ ]:

63. Create an array class that has a name attribute (★★☆)


In [ ]:

64. Consider a given vector, how to add 1 to each element indexed by a second vector (be careful with repeated indices)? (★★★)


In [ ]:

65. How to accumulate elements of a vector (X) to an array (F) based on an index list (I)? (★★★)


In [ ]:

66. Considering a (w,h,3) image of (dtype=ubyte), compute the number of unique colors (★★★)


In [ ]:

67. Considering a four dimensions array, how to get sum over the last two axis at once? (★★★)


In [ ]:

68. Considering a one-dimensional vector D, how to compute means of subsets of D using a vector S of same size describing subset indices? (★★★)


In [ ]:

69. How to get the diagonal of a dot product? (★★★)


In [ ]:

70. Consider the vector [1, 2, 3, 4, 5], how to build a new vector with 3 consecutive zeros interleaved between each value? (★★★)


In [ ]:

71. Consider an array of dimension (5,5,3), how to mulitply it by an array with dimensions (5,5)? (★★★)


In [ ]:

72. How to swap two rows of an array? (★★★)


In [ ]:

73. Consider a set of 10 triplets describing 10 triangles (with shared vertices), find the set of unique line segments composing all the triangles (★★★)


In [ ]:

74. Given an array C that is a bincount, how to produce an array A such that np.bincount(A) == C? (★★★)


In [ ]:

75. How to compute averages using a sliding window over an array? (★★★)


In [ ]:

76. Consider a one-dimensional array Z, build a two-dimensional array whose first row is (Z[0],Z[1],Z[2]) and each subsequent row is shifted by 1 (last row should be (Z[-3],Z[-2],Z[-1]) (★★★)


In [ ]:

77. How to negate a boolean, or to change the sign of a float inplace? (★★★)


In [ ]:

78. Consider 2 sets of points P0,P1 describing lines (2d) and a point p, how to compute distance from p to each line i (P0[i],P1[i])? (★★★)


In [ ]:

79. Consider 2 sets of points P0,P1 describing lines (2d) and a set of points P, how to compute distance from each point j (P[j]) to each line i (P0[i],P1[i])? (★★★)


In [ ]:

80. Consider an arbitrary array, write a function that extract a subpart with a fixed shape and centered on a given element (pad with a fill value when necessary) (★★★)


In [ ]:

81. Consider an array Z = [1,2,3,4,5,6,7,8,9,10,11,12,13,14], how to generate an array R = [[1,2,3,4], [2,3,4,5], [3,4,5,6], ..., [11,12,13,14]]? (★★★)


In [ ]:

82. Compute a matrix rank (★★★)


In [ ]:

83. How to find the most frequent value in an array?


In [ ]:

84. Extract all the contiguous 3x3 blocks from a random 10x10 matrix (★★★)


In [ ]:

85. Create a 2D array subclass such that Z[i,j] == Z[j,i] (★★★)


In [ ]:

86. Consider a set of p matrices wich shape (n,n) and a set of p vectors with shape (n,1). How to compute the sum of of the p matrix products at once? (result has shape (n,1)) (★★★)


In [ ]:

87. Consider a 16x16 array, how to get the block-sum (block size is 4x4)? (★★★)


In [ ]:

88. How to implement the Game of Life using numpy arrays? (★★★)


In [ ]:

89. How to get the n largest values of an array (★★★)


In [ ]:

90. Given an arbitrary number of vectors, build the cartesian product (every combinations of every item) (★★★)


In [ ]:

91. How to create a record array from a regular array? (★★★)


In [ ]:

92. Consider a large vector Z, compute Z to the power of 3 using 3 different methods (★★★)


In [ ]:

93. Consider two arrays A and B of shape (8,3) and (2,2). How to find rows of A that contain elements of each row of B regardless of the order of the elements in B? (★★★)


In [ ]:

94. Considering a 10x3 matrix, extract rows with unequal values (e.g. [2,2,3]) (★★★)


In [ ]:

95. Convert a vector of ints into a matrix binary representation (★★★)


In [ ]:

96. Given a two dimensional array, how to extract unique rows? (★★★)


In [ ]:

97. Considering 2 vectors A & B, write the einsum equivalent of inner, outer, sum, and mul function (★★★)


In [ ]:

98. Considering a path described by two vectors (X,Y), how to sample it using equidistant samples (★★★)?


In [ ]:

99. Given an integer n and a 2D array X, select from X the rows which can be interpreted as draws from a multinomial distribution with n degrees, i.e., the rows which only contain integers and which sum to n. (★★★)


In [ ]:

100. Compute bootstrapped 95% confidence intervals for the mean of a 1D array X (i.e., resample the elements of an array with replacement N times, compute the mean of each sample, and then compute percentiles over the means). (★★★)


In [ ]: